package bean;

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import util.Util;

public class Arquivo {

	private String caminho;
	private ArrayList<Pacote> pacotes;
	private byte[] enderecoDestino;

	public Arquivo(String caminho, byte[] destino) {
		capturarArquivo(caminho);
		enderecoDestino = destino;
		setEnderecosDestinoOrigem(destino, Util.getEnderecoMaquina());
	}

	public byte[] getEnderecoDestino() {
		return enderecoDestino;
	}

	public void setEnderecoDestino(byte[] enderecoDestino) {
		this.enderecoDestino = enderecoDestino;
	}

	private void capturarArquivo(String caminho) {
		this.caminho = caminho;
		DataInputStream is = null;
		Pacote pacote = new Pacote();
		pacotes = new ArrayList<Pacote>();
		boolean incompleto = true;
		try {
			is = new DataInputStream(new FileInputStream(caminho));
			byte b;
			while (true) {
				b = is.readByte();
				incompleto = pacote.adicionarByteDados(b);
				if (!incompleto) {
					pacote.getCrc();
					pacotes.add(pacote);
					pacote = new Pacote();
					pacote.adicionarByteDados(b);
				}
			}
		} catch (EOFException eof) {
			if (pacote.getDados().size() != 0) {
				pacote.getCrc();
				pacotes.add(pacote);
			}
			System.out.println("Fim do carregamento normal.");
		} catch (FileNotFoundException noFile) {
			System.err.println("File not found! " + noFile);
		} catch (IOException io) {
			System.err.println("I/O error occurred: " + io);
		} catch (Throwable anything) {
			System.err.println("Abnormal exception caught !: " + anything);
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException ignored) {
				}
			}
		}
	}

	public void setEnderecosDestinoOrigem(byte[] destino, byte[] origem) {
		for (Pacote pacote : pacotes) {
			pacote.setEnderecoOrigem(origem);
			pacote.setEnderecoDestino(destino);
			pacote.getCrc();
		}
	}

	public String getCaminho() {
		return caminho;
	}

	public void setCaminho(String caminho) {
		this.caminho = caminho;
	}

	public ArrayList<Pacote> getPacotes() {
		return pacotes;
	}

	public void setPacotes(ArrayList<Pacote> pacotes) {
		this.pacotes = pacotes;
	}
}
